/**
 * 修复了组合继承的问题
 * @param obj
 * @returns {F}
 * 第六种方式是寄生式组合继承，组合继承的缺点就是使用超类型的实例做为子类型的原型，导致添加了不必要的原型属性。
 寄生式组合继承的方式是使用超类型的原型的副本来作为子类型的原型，这样就避免了创建不必要的属性。
 */




//demo1
function SuperType(options) {
    this.options = options;
}
SuperType.prototype.say=function(n){
    console.log(n)
}
SuperType.prototype.obj={
    get(){
        console.log('SuperType get...')
    }
}

function SubType(options,...args) {
    SuperType.call(this, ...args);
    this.options = options;
    this.name = null
}


SubType.prototype = Object.create(SuperType.prototype,{
    getName:{
        value:()=>{
            return this.name
        }
    },
    setName:{
        value:(name)=>{
            this.name = name
        }
    }
});

SubType.prototype.constructor = SubType;
SubType.prototype.obj={
    get(){
        console.log('SuperType get...')
    }
}

let subType =  new SubType()
let superType =  new SuperType()

subType.say('super1') // super1


subType.setName('super1 name')
console.log(subType.getName()); // super1 name

console.log(SubType.prototype.constructor) // [Function: SubType]



subType.obj.get()
superType.obj.get()






